package com.sprouting.personal.dao;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sprouting.personal.model.entity.Bill;
import com.sprouting.personal.model.vo.*;
import com.sprouting.personal.service.BillService;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 账单
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/12/27 9:32
 */
public interface BillDao extends BaseMapper<Bill> {

    /**
     * 根据组ID查询账单
     * @param groupId 组ID
     * @param page 分页参数
     * @return
     */
    Page<Bill> getBillByGroupId(Page page, @Param("groupId") String groupId);

    /**
     * 根据组ID查询账单 只查询一条出来
     * @param groupId 组ID
     * @return
     */
    Bill getBillByGroupIdLimit1(String groupId);

    /**
     * 获取上一次的账单
     * @return
     */
    BillVo getLastTimeBill(String userId);

    /**
     * 分页查询账单
     * @param page 分页参数
     * @param billQuery 查询参数
     * @return
     */
    Page<BillVo> getBillPageList(Page page, @Param("billQuery") BillQuery billQuery);

    /**
     * 获取最常用的五个账单类型
     * @param userId 当前用户ID
     * @return
     */
    List<String> getMostCommonlyUsedType(String userId);

    /**
     * 解绑账单组
     * @param id 账单组ID
     * @param userId 当前登录用户ID
     * @param date 当前时间
     */
    void updBillUnbinding(@Param("id") String id, @Param("userId") String userId, @Param("date") Date date);

    /**
     * 获取一段时间的开支情况
     * @param userId 登录用户
     * @param dateTimeStart 开始时间
     * @param dateTimeEnd 结束时间
     * @return
     */
    BillUsage getExpenditure(@Param("userId") String userId, @Param("dateTimeStart") DateTime dateTimeStart, @Param("dateTimeEnd") DateTime dateTimeEnd);

    /**
     * 获取一段时间的开支情况
     * {@link BillService#getExpenditure(String, DateTime, DateTime)} 和这个类型
     * @param billQuery 查询参数
     * @return
     */
    BillUsage getExpenditureQuery(@Param("billQuery") BillQuery billQuery);

    /**
     * 查询账单分组情况
     * @param userId 登录用户
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param incomeOrExpenditure 是支出还是收入 {@link com.sprouting.personal.interfaces.common.Constant.RevenueExpense}
     * @return
     */
    List<BillGroupExpenses> getPercentageGroup(@Param("userId") String userId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime, @Param("incomeOrExpenditure") Integer incomeOrExpenditure);

    /**
     * 查询账单分组情况
     * 因为要查询对应的人员账单，导致必须加子查询，否则数据有问题
     * {@link BillService#getPercentageGroup(String, DateTime, DateTime, Integer)}  相似
     * @param billQuery 查询参数
     * @return
     */
    List<BillGroupExpenses> getPercentageGroupQuery(@Param("billQuery") BillQuery billQuery);

    /**
     * 获取每天的支出数量和笔数
     * @param userId 登录用户
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<BillDailyExpenditure> getExpenditureTrend(@Param("userId") String userId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    /**
     * 获取指定时间范围内每个月的支出数量和笔数
     * @param userId 登录用户
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<BillMonthExpenses> getExpendituresForEachMonthYear(@Param("userId") String userId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    /**
     * 获取历年支出情况
     * @param userId 登录用户
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<BillYearExpenses> getExpenditureOverYears(@Param("userId") String userId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    /**
     * 获取每个人一段时间内的支出收入情况
     * @param userId 登录用户
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<BillUser> getExpenditurePerson(@Param("userId") String userId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    /**
     * 获取每个人一段时间内的支出收入情况
     * {@link BillService#getExpenditurePerson(String, DateTime, DateTime)} 和这个相比多了一些参数
     * @param billQuery 查询参数
     * @return
     */
    List<BillUser> getExpenditurePersonQuery(@Param("billQuery") BillQuery billQuery);

    /**
     * 过去一段时间每个月每人的支出情况
     * @param userId 登录用户
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<BillUserMonth> getMonthlyExpenditurePerPersonInThePast(@Param("userId") String userId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);

    /**
     * 统计根据该查询条件得到的收入和支出结果
     * @param billQuery 查询条件
     * @return
     */
    BillExpensesAndReceipts getBillCountList(@Param("billQuery")  BillQuery billQuery);


}
